class IdGenerator {
  constructor() {
    this.processID = process.pid % 0xff; // 使用进程ID的低8位
    this.sequence = 0; // 每个进程内部的序列号
    this.lastTimestamp = 0; // 上次生成ID的时间戳低10位
  }

  getNextID() {
    let currentTimestamp = Math.floor(Date.now() / 1000) & 0x3ff; // 当前时间戳低10位

    // 防止在同1秒内生成ID过快导致序列号溢出
    if (currentTimestamp === this.lastTimestamp) {
      this.sequence = (this.sequence + 1) & 0xfff; // 序列号递增并取模
      if (this.sequence === 0) {
        // 如果序列号溢出，等待下一秒
        while (currentTimestamp <= this.lastTimestamp) {
          currentTimestamp = Math.floor(Date.now() / 1000) & 0x3ff;
        }
      }
    } else {
      this.sequence = 0; // 新的秒，重置序列号
    }

    this.lastTimestamp = currentTimestamp; // 更新最后生成ID的时间戳

    // 组合ID：时间戳低10位 | 进程ID低8位 | 序列号12位
    return (currentTimestamp << 20) | (this.processID << 12) | this.sequence;
  }
}

// 使用示例
exports.IdGenerator = new IdGenerator();
